# 定义工具类
import json
import time

from selenium import webdriver
from appium import webdriver as appdriver
from selenium.webdriver.common.by import By


class UtilsDriver:
    # 定义自媒体平台驱动标识
    ttmp_driver = None

    # 判断自媒体驱动是否退出的标识
    is_quit_ttmp_driver = True

    # 定义后台管理系统的驱动标识
    ttmis_driver = None

    # 判断后台管理系统的驱动是否退出的标识
    is_quit_ttmis_driver = True
    # 定义app的驱动标识
    app_driver = None
    # 判断app的驱动是否退出的标识
    is_quit_app_driver = True
    # 确定app的初始化配置参数
    des_cap = {
        'platformName': "Android",  # 表示的是平台类型
        'platformVersion': '5.1',  # 表示的平台的版本
        'deviceName': '****',  # 表示的是设备的ID，如果只有一个设备连接，可以用****代替
        'appPackage': 'com.itcast.toutiaoApp',  # 指执行自动化app的包名
        'appActivity': '.MainActivity'  # app的界面名， 界面名必须为app首次打开的界面名
    }

    # 获取自媒体驱动
    @classmethod
    def get_ttmp_driver(cls):
        if cls.ttmp_driver is None:
            cls.ttmp_driver = webdriver.Chrome()
            cls.ttmp_driver.get("http://ttmp.research.itcast.cn/")
            cls.ttmp_driver.maximize_window()
        return cls.ttmp_driver

    # 退出自媒体驱动
    @classmethod
    def quit_ttmp_driver(cls):
        if cls.ttmp_driver is not None and cls.is_quit_ttmp_driver:
            cls.get_ttmp_driver().quit()
            cls.ttmp_driver = None

    # 获取后台管理系统驱动
    @classmethod
    def get_ttmis_driver(cls):
        if cls.ttmis_driver is None:
            cls.ttmis_driver = webdriver.Chrome()
            cls.ttmis_driver.get("http://ttmis.research.itcast.cn/")
            cls.ttmis_driver.maximize_window()
        return cls.ttmis_driver

    # 退出后台管理系统驱动
    @classmethod
    def quit_ttmis_driver(cls):
        if cls.ttmis_driver is not None and cls.is_quit_ttmis_driver:
            cls.get_ttmis_driver().quit()
            cls.ttmis_driver = None

    # 获取app的驱动
    @classmethod
    def get_app_driver(cls):
        if cls.app_driver is None:
            cls.app_driver = appdriver.Remote("http://localhost:4723/wd/hub", cls.des_cap)
        return cls.app_driver

    # 退出app驱动
    @classmethod
    def quit_app_driver(cls):
        if cls.app_driver is not None and cls.is_quit_app_driver:
            cls.get_app_driver().quit()
            cls.app_driver = None


# 定义频道选择的方法
def choice_channel(driver, element, text):
    """
    :param driver:  表示的是驱动对象
    :param element:  表示的是选择框元素对象
    :param text:  表示要选择的频道的文本内容
    :return:
    """
    element.click()
    time.sleep(1)
    xpath = "//*[text()='{}']".format(text)  # 将text的文本内容传到xpath表达式当中。
    driver.find_element_by_xpath(xpath).click()


# 定义判断元素是否存在的方法
def is_element_exist(driver, element_info):
    """
    :param driver:  表示的是驱动对象
    :param element_info: 表示的是元素的定位信息（By.CSS_SELECTOR, ".user-name"）
    :return:
    """
    try:
        driver.find_element(*element_info)  # 定位元素，如果定位得到，返回True
        return True
    except Exception as e:
        return False  # 如果定位元素时，报错了，说明没有找到该元素，返回False


# 封装边滑动边查找的方法
def swipe_find(driver, element, channel):
    """
    :param driver: 表示的是驱动对象
    :param element:  表示的是滑动的元素对象
    :param channel: 表示的是查找的频道文本内容
    :return:
    """
    # 获取滑动元素对象的坐标点
    lc = element.location
    # 获取滑动元素对象的大小
    sz = element.size
    # 计算出滑动的起始点坐标
    start_x = lc['x'] + sz['width'] * 0.9
    start_y = lc['y'] + sz['height'] / 2
    # 计算出滑动的终止点坐标
    end_x = lc['x'] + sz['width'] * 0.1
    end_y = lc['y'] + sz['height'] / 2
    while True:
        page_source = driver.page_source  # 获取当前的页面资源
        try:
            xpath = "//*[contains(@text, '{}')]".format(channel)
            driver.find_element(By.XPATH, xpath).click()
            time.sleep(2)
            return 0
        except Exception as e:
            driver.swipe(start_x, start_y, end_x, end_y, duration=2000)
            time.sleep(1)
        if driver.page_source == page_source:
            # 通过判断上一次的页面资源与本次页面的次源是否相等，如果相等就说明已经滑动到最后一页。
            # 如果不相等，说明没有到最后一页，还可以继续滑动找到频道
            print("当前已经滑动到最后一页，未找到对应的频道！")
            return 0


# 定义一个获取测试用例数据的方法
def get_case_data(filename):
    with open(filename,'r', encoding='utf-8') as f:
        data = json.load(f)
    case_list = []
    for i in data.values():
        case_list.append(tuple(i.values()))  # 将强制转换的用例数据增加到空列表中
    return case_list